package com.hb.trade.api.routine.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.hb.core.pojo.center.au.dto.OrgDTO;
import com.hb.core.pojo.center.au.dto.RoleDTO;
import com.hb.core.pojo.center.au.entity.User;
import com.hb.core.pojo.enums.RoleDataAuthEnum;
import com.hb.core.pojo.parent.MPCommonEntity;
import com.hb.core.pojo.RoleDataAuthEntity;
import com.hb.trade.client.center.OrgClient;
import com.hb.trade.client.center.OrgDeptClient;
import com.hb.trade.client.center.RoleClient;
import com.hb.trade.client.center.UserClient;
import org.apache.xmlbeans.UserType;
import org.fzzn.core.auth.shiro.util.ShiroUtil;
import org.fzzn.core.model.enums.UserTypeEnum;
import org.fzzn.core.model.msg.Message;
import org.fzzn.core.util.Enums;

import java.util.List;

/**
 * 角色数据权限设置
 *
 * @author zhaojk
 */
public class RoleDataAuthUtil {

    /**
     * 构建数据权限
     */
    public static RoleDataAuthEntity buildDataAuth() {
        return buildDataAuth(null);
    }

    public static RoleDataAuthEntity buildDataAuth(RoleDataAuthEntity entity) {
        if (entity == null) {
            entity = new RoleDataAuthEntity();
        }
        // 查询当前用户的角色列表
        Long userId = ShiroUtil.getUserId();

        UserClient userClient = SpringUtil.getBean(UserClient.class);
        Message<User> userMessage = userClient.getByUserId(userId);
        if (userMessage.isSuccess()) {
            User data = userMessage.getData();
            Integer userType = data.getUserType();
            // 超级管理员没有任何限制
            if (Enums.equals(UserTypeEnum.SUPER_ADMIN, userType)) {
                return entity;
            }
        }

        User currentUser = new User();
        currentUser.setId(userId);
        RoleClient roleClient = SpringUtil.getBean(RoleClient.class);
        Message<List<RoleDTO>> message = roleClient.listRolesByUser(currentUser);

        // 获取权限最大的角色
        List<RoleDTO> roleDTOS = message.getData();
        RoleDTO max = CollUtil.max(roleDTOS);

        // 设置数据权限, 添加数据权限条件
        RoleDataAuthEnum roleDataAuthEnum = Enums.of(RoleDataAuthEnum.class, max.getRoleDataAuth());
        /*
         * 设置数据权限, 添加数据权限条件
         * 4. 全公司（含分公司/部门）所有数据：仅总公司有此选项
         * 3. 所属公司（含下级部门）数据
         * 2. 所属部门数据
         * 1. 仅个人数据
         */
        if (roleDataAuthEnum == null) {
            return new RoleDataAuthEntity();
        }
        switch (roleDataAuthEnum) {
            // 仅个人数据
            case PERSONAL:
                entity.addUserId(userId);
                break;
            // 所属部门数据
            case CHILD_DEPT_ONLY:
                // 查询当前用户所在部门下的所有用户
                OrgDeptClient orgDeptClient = SpringUtil.getBean(OrgDeptClient.class);
                Message<List<Long>> userIdsMsg = orgDeptClient.listUserIdsByWorkMate(userId);
                entity.addUserId(userIdsMsg.getData());
                break;
            // 所属公司（含下级部门）数据
            case CHILD_COMPANY_ONLY:
                entity.addOrgId(ShiroUtil.getOrgId());
                break;
            // 全公司（含分公司/部门）所有数据：仅总公司有此选项
            case ALL_COMPANY:
                // 查询当前用户所在企业的全部数据
                OrgClient orgClient = SpringUtil.getBean(OrgClient.class);
                Message<List<OrgDTO>> listMessage = orgClient.listParentAndSon(ShiroUtil.getOrgId());
                if (listMessage.isSuccess()) {
                    List<Long> orgIds = CollUtil.map(listMessage.getData(), MPCommonEntity::getId, true);
                    entity.addOrgId(orgIds);
                }
                break;
            default:
                break;
        }
        return entity;
    }
}
